package com.wuwei.tran.controller;

import com.wuwei.tran.domain.MyFile;
import com.wuwei.tran.service.FileService;
import com.wuwei.tran.utils.Result;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;

import static org.springframework.util.FileSystemUtils.deleteRecursively;

@RestController
@RequestMapping(value="tran/file")
@CrossOrigin
public class FileController {

    @Value("${ROOT_PATH}")
    private String filePath;

    @PostMapping("file")
    public Result<String> file(MultipartFile file,@RequestParam("path")String path){
        // 获取上传文件的原始文件名
        String fileName = file.getOriginalFilename();

        // 指定文件保存的路径（假设为 "D:/uploads"）
        String filePath = this.filePath +"\\"+ path + fileName;

        try {

            if (!new File(filePath).exists()) {//如果文件夹不存在，则自动创建
                //检查文件夹是否创建成功
                boolean mkdirs = new File(filePath).mkdirs();
                if (!mkdirs) {
                    return Result.fail("创建文件失败！");
                }
            }

            File destFile = new File(filePath);

            // 保存上传的文件到目标文件
            file.transferTo(destFile);
            return Result.ok("文件保存成功");

        } catch (IOException e) {
            return Result.fail("文件保存失败：" + e.getMessage());
        }
    }

    @GetMapping("total")
    public Result<Integer> total( @RequestParam(value = "name", required = false, defaultValue = "") String name){
        File folder = new File(this.filePath); // 指定要读取的文件夹路径
        File[] fileList = folder.listFiles(File::isFile);
        List<File> files = Arrays.stream(fileList).filter(file -> file.getName().contains(name)).collect(Collectors.toList());
        Integer total =  files.size();
        return Result.ok(total);
    }

    @Resource
    private FileService fileService;

    /**
     * 获取指定路径下所有文件和文件夹
     * @param name
     * @return
     */
    @SneakyThrows
    @GetMapping("/search")
    public Result<List<MyFile>> getListV1(
            @RequestParam(value = "name", required = false, defaultValue = "") String name // 将 name 设置为可选，默认值为空
    ){
        List<MyFile> list = fileService.searchFile(name);
        return Result.ok(list);
    }

//    /**
//     * 获取指定路径下所有文件不包括文件夹
//     * @param currentPage
//     * @param pageSize
//     * @param name
//     * @return
//     */
//    @GetMapping("/getList")
//    public Result<MyFile[]> getList(
//            @RequestParam("currentPage") Integer currentPage,
//            @RequestParam("pageSize") Integer pageSize,
//            @RequestParam(value = "name", required = false, defaultValue = "") String name // 将 name 设置为可选，默认值为空
//    ){
//        File folder = new File(this.filePath); // 指定要读取的文件夹路径
//        // 获取文件夹下的所有文件，不包括子文件夹
//        File[] fileList = folder.listFiles(File::isFile);
//        assert fileList != null;
//        List<File> files = Arrays.stream(fileList)
//                .filter(file -> file.getName().contains(name))  // 先按文件名过滤
//                .sorted((file1, file2) -> Long.compare(file2.lastModified(), file1.lastModified()))  // 按修改日期降序排序
//                .collect(Collectors.toList());
//        int endPage = currentPage*pageSize;
//        int startPage = pageSize*(currentPage-1);
//
//        MyFile[] returnFiles;
//        int index = 0;
//        if (endPage>files.size()) {
//            endPage = files.size();
//            returnFiles = new MyFile[files.size()-startPage];
//        } else {
//            returnFiles = new MyFile[pageSize];
//        }
//        for (int i = startPage; i < endPage; i++) {
//            File thisFile = files.get(i);
//            if (thisFile!=null) {
////                returnFiles[i] = thisFile;
//                MyFile myFile = new MyFile();
//                myFile.setName(thisFile.getName());
//                myFile.setLength((thisFile.length()/1024)+"KB");
//                myFile.setPath((thisFile.getAbsolutePath()));
//                Date date = new Date(thisFile.lastModified());
//                myFile.setLastModified(date); // 获取文件修改日期并设置到 MyFile 对象中
//                try {
//                    // 获取文件图标并设置到 myFile 对象中
//                    String iconBase64 = FileUtils.getFileIconBase64(thisFile);
//                    myFile.setIcon(iconBase64);
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//                returnFiles[index++] = myFile;
//            } else {
//                break;
//            }
//        }


//        List<MyFile> myFiles = listFiles(folder);
//        return Result.ok(myFiles);
//        return Result.ok(returnFiles);
//    }

//    public static List<MyFile> listFiles(File folder) {
//        File[] files = folder.listFiles();
//        List<MyFile> list = new ArrayList<>();
//
//        if (files != null) {
//            for (File file : files) {
//                if (file.isDirectory()) {
//                    listFiles(file); // 递归调用，继续遍历子文件夹
//                } else {
//                    setMyFile(list, file);
//                }
//            }
//        }
//        return list;
//    }


    @SneakyThrows
    @PostMapping("delete")
    public Result<String> delete(@RequestBody MyFile myFile){
        String path = myFile.getPath();
        File file = new File(path); // 指定要读取的文件夹路径
        // 确保文件或文件夹路径存在
        if (!file.exists()) {
            return Result.fail("文件或文件夹不存在！");
        }

//        File file = searchFiles(folder, newName);
        boolean deleteResult = deleteRecursively(file.toPath());
        if (!deleteResult) {
            return Result.fail("删除失败！");
        } else {
            return Result.ok("删除成功！");
        }
    }

    @PostMapping("download")
    public byte[] downLoad(@RequestBody MyFile myFile){
        File file = new File(myFile.getPath()); // 指定要读取的文件夹路径
        try (FileInputStream fis = new FileInputStream(file)) {
            byte[] fileContent = new byte[(int) file.length()];
            fis.read(fileContent);

//                // 删除文件
//                boolean deleteResult = Files.deleteIfExists(file.toPath());
//                if (!deleteResult) {
////                    System.out.println("Failed to delete the file: " + file.getName());
////                    // 可以选择抛出异常或者记录日志
//                }
            return fileContent;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    @PostMapping("rename")
    public Result<String> rename(@RequestBody MyFile fileDto) {
        String name = fileDto.getName();
        File file = new File(fileDto.getPath()); // 指定要读取的文件或文件夹路径

        // 确保文件或文件夹路径存在
        if (!file.exists()) {
            return Result.fail("文件或文件夹不存在！");
        }

        // 创建一个新的文件对象，拼接新的文件名
        File newFile = new File(file.getParent(), name); // 使用父目录加上新的文件名

        // 执行重命名操作
        if (file.renameTo(newFile)) {
            return Result.ok("文件重命名成功！");
        } else {
            return Result.fail("文件重命名失败！");
        }
    }




//    private static void setMyFile(List<MyFile> list, File file) {
//        MyFile myFile = new MyFile();
//        myFile.setName(file.getName());
//        myFile.setPath(file.getAbsolutePath());
//        myFile.setLength(String.valueOf(file.length()/1024)+"KB");
//        Date date = new Date(file.lastModified());
//        myFile.setLastModified(date); // 获取文件修改日期并设置到 MyFile 对象中
//        list.add(myFile);
//    }

    /**
     * 精确搜索文件
     * @param folder
     * @param fileName
     * @return
     */
    public static File searchFiles(File folder, String fileName) {
        if (folder.isDirectory()) {
            File[] files = folder.listFiles();
            if (files != null) {
                for (File file : files) {
                    if (file.getName().equals(fileName)) {
                        return file;
                    }
                }
            }
        }
        return null;
    }



}
